package com.yangdage.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    private Logger logger = LoggerFactory.getLogger(ScheduleConfig.class);

    //时间表达式  每2秒执行一次
    private String cron = "0/2000 * * * * ?";

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /*****
     * 大家在日常工作中，一定使用过 Spring 的 @Scheduled 注解吧，通过该注解可以非常方便的帮助我们实现任务的定时执行。
     *
     * 但是该注解是不支持运行时动态修改执行间隔的，不知道你在业务中有没有这些需求和痛点：
     *
     * •在服务运行时能够动态修改定时任务的执行频率和执行开关，而无需重启服务和修改代码•能够基于配置，在不同环境/机器上，实现定时任务执行频率的差异化
     *
     * 这些都可以通过 Spring 的 SchedulingConfigurer 注解来实现。
     *
     * 这个注解其实大家并不陌生，如果有使用过 @Scheduled 的话，因为 @Scheduled 默认是单线程执行的，因此如果存在多个任务同时触发，可能触发阻塞。使用 SchedulingConfigurer 可以配置用于执行 @Scheduled 的线程池，来避免这个问题。
     * @param scheduledTaskRegistrar
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(3));
        scheduledTaskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                //任务逻辑
                logger.info("---------------start-------------------");
                logger.info("动态修改定时任务参数，时间表达式cron为：" + cron);
                logger.info("当前时间为：" + sdf.format(new Date()));
                logger.info("----------------end--------------------");
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                logger.info("---------------nextExecutionTime-------------------");
                CronTrigger cronTrigger = new CronTrigger(cron);
                Date nextExecDate = cronTrigger.nextExecutionTime(triggerContext);
                return nextExecDate;
            }
        });
    }

    public void setCron(String cron) {
        this.cron = cron;
    }




    /*@Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //设定一个长度10的定时任务线程池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }*/
}